/**
 * 作者：
 * 创建时间：2012-6-27 上午9:28:46
 */
package dragon.model.fieldTemplate;

import java.util.List;
import java.util.Map;

import dragon.core.util.DateUtils;
import dragon.model.base.Model;
import dragon.model.base.ModelDescribe;

/**
 * 字段模板定义
 */
public class FieldTemplate extends Model implements Cloneable {

	/**
	 * 字段模板类型，决定了展现形式
	 */
	@ModelDescribe(annotation = "字段模板类型，决定了展现形式")
	private FieldTemplateType type;

	/*-------------------------CheckBox,Radio,Select特有属性-------------------------*/

	/**
	 * 数据来源，通过 sql 查询<br>
	 * CheckBox,Radio,Select特有<br>
	 * 字段模板类型为CheckBox或Radio时，sql中返回两列，分别为value 和 text ，用于表示字段的实际值和显示值<br>
	 * 字段模板类型为Select时，sql语句中必须返回id和text；可以返回state用于控制节点的默认状态(open或closed)，也可以不提供(默认closed)；sql中返回的其它字段将封装到attributes中；sql语句中where部分的参数预留
	 * ，第一次查询的参数值使用dicRoot的值，也就是说必须同时提供dicRoot,当dicRoot和sql同时存在时,数据来源取sql
	 */
	@ModelDescribe(annotation = "数据来源，通过 sql 查询<br>CheckBox,Radio,Select特有<br>字段模板类型为CheckBox或Radio时，sql中返回两列，分别为value 和 text ，用于表示字段的实际值和显示值<br>字段模板类型为Select时，sql语句中必须返回id和text；可以返回state用于控制节点的默认状态(open或closed)，也可以不提供(默认closed)；sql中返回的其它字段将封装到attributes中；sql语句中where部分的参数预留，第一次查询的参数值使用dicRoot的值，也就是说必须同时提供dicRoot,当dicRoot和sql同时存在时,数据来源取sql")
	private String sql;

	/**
	 * 待选项{key:value,key:value,key:value...}<br>
	 * CheckBox和Radio特有<br>
	 * 如果同时定义了sql，则优先处理options
	 */
	@ModelDescribe(annotation = "待选项{key:value,key:value,key:value...}<br>CheckBox和Radio特有<br>如果同时定义了sql，则优先处理options")
	private String options;

	/**
	 * 待选项(解析时自动处理)
	 */
	@ModelDescribe(annotation = "待选项(解析时自动处理)", runtime = true)
	private List<Map<String, Object>> optionsList = null;

	/**
	 * 数据入口<br>
	 * Select特有<br>
	 * 如果Select的数据来源于数据字典，则dicRoot为数据字典的节点ID，默认为数据字典的根节点<br>
	 * 如果Select的数据来源于sql，则dicRoot将在首次查询sql时作为参数传递到sql语句中
	 */
	@ModelDescribe(annotation = "数据入口<br>Select特有<br>如果Select的数据来源于数据字典，则dicRoot为数据字典的节点ID，默认为数据字典的根节点<br>如果Select的数据来源于sql，则dicRoot将在首次查询sql时作为参数传递到sql语句中")
	private int dicRoot = -1;

	/**
	 * 自定义数据提供者，实现类需要继承接口 dragon.model.fieldTemplate.FieldTemplateDataProvider<br>
	 * CheckBox,Radio,Select特有属性
	 * 
	 * @ModelDescribe(annotation = "自定义数据提供者，实现类需要继承接口 dragon.model.fieldTemplate.FieldTemplateDataProvider<br>
	 *                           CheckBox,Radio,Select特有属性")
	 */
	private IFieldTemplateDataProvider dataProvider;

	/**
	 * 是否缓存数据(0否，1是)<br>
	 * CheckBox,Radio,Select特有属性
	 */
	@ModelDescribe(annotation = "是否缓存数据(0否，1是)<br>CheckBox,Radio,Select特有属性")
	private int cache = 0;

	/**
	 * 是否只能选择叶子节点(0否，1是)<br>
	 * CheckBox,Radio,Select特有属性
	 */
	@ModelDescribe(annotation = "是否只能选择叶子节点(0否，1是)<br>CheckBox,Radio,Select特有属性")
	private int onlyLeafSelect = 0;

	/**
	 * 是否采用原生组件(0否，1是)<br>
	 * CheckBox和Radio特有属性
	 */
	@ModelDescribe(annotation = "是否采用原生组件(0否，1是)<br>CheckBox和Radio特有属性")
	private int proto = 0;

	/*-------------------------DateTime特有属性-------------------------*/

	/**
	 * 日期时间格式<br>
	 * DateTime特有属性
	 */
	@ModelDescribe(annotation = "日期时间格式<br>DateTime特有属性")
	private String format = DateUtils.yyyy_MM_dd_HH_mm_ss;

	/**
	 * 自动填充，用当前日期，时间，日期时间填充<br>
	 * Date,Time,DateTime特有属性
	 */
	@ModelDescribe(annotation = "自动填充，用当前日期，时间，日期时间填充<br>Date,Time,DateTime特有属性")
	private int autofill = 0;

	/*-------------------------File特有属性-------------------------*/
	/**
	 * 支持最大上传文件大小，单位为KB，默认为2048KB<br>
	 * File特有属性<br>
	 * TODO:暂未启用(预留)
	 */
	@ModelDescribe(annotation = "支持最大上传文件大小，单位为KB，默认为2048KB<br>File特有属性<br>暂未启用(预留)")
	private int fileSize = 2048;

	/**
	 * 支持上传的文件类型<br>
	 * File特有属性<br>
	 */
	@ModelDescribe(annotation = "支持上传的文件类型<br>File特有属性")
	private String acceptFileType = "";

	/*-------------------------BDSelector特有属性-------------------------*/

	/**
	 * 业务模型对象code<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "业务模型对象code<br>BDSelector特有属性")
	private String bizCode;

	/**
	 * 值字段(调用的业务对象中的字段)<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "值字段(调用的业务对象中的字段)<br>BDSelector特有属性")
	private String valueField;

	/**
	 * 文本字段(调用的业务对象中的字段)<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "文本字段(调用的业务对象中的字段)<br>BDSelector特有属性")
	private String textField;

	/**
	 * 弹出窗口宽度<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "弹出窗口宽度<br>BDSelector特有属性")
	private int windowWidth = 800;

	/**
	 * 弹出窗口高度<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "弹出窗口高度<br>BDSelector特有属性")
	private int windowHeight = 500;

	/**
	 * 是否允许最大化(0否，1是)<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "是否允许最大化(0否，1是)<br>BDSelector特有属性")
	private int maximizable = 1;

	/**
	 * 窗口弹出时是否默认最大化(0否，1是)<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "窗口弹出时是否默认最大化(0否，1是)<br>BDSelector特有属性")
	private int maximize = 0;

	/**
	 * 自定义页面路径<br>
	 * BDSelector特有属性
	 */
	@ModelDescribe(annotation = "自定义页面路径<br>BDSelector特有属性")
	private String url;

	/*-------------------------CheckBox,Select,BDSelector,File特有属性-------------------------*/
	/**
	 * 是否可以多选(0否，1是)；对于文件类型，如果值为1，则可以上传多个文件<br>
	 * CheckBox,Select,BDSelector,File特有属性
	 */
	@ModelDescribe(annotation = "是否可以多选(0否，1是)<br>对于文件类型，如果值为1，则可以上传多个文件<br>CheckBox,Select,BDSelector,File特有属性")
	private int multiple = 0;

	@Override
	public String toString() {
		StringBuilder str = new StringBuilder();
		str.append(super.toString());
		str.append("dragon.model.fieldTemplate.FieldTemplate:\n");
		str.append("type=").append(type).append("\t");
		str.append("sql=").append(sql).append("\t");
		str.append("options=").append(options).append("\t");
		str.append("dicRoot=").append(dicRoot).append("\t");
		str.append("multiple=").append(multiple).append("\t");
		str.append("cache=").append(cache).append("\t");
		str.append("onlyLeafSelect=").append(onlyLeafSelect).append("\t");
		str.append("proto=").append(proto).append("\t");
		str.append("format=").append(format).append("\t");
		str.append("autofill=").append(autofill).append("\t");
		str.append("fileSize=").append(fileSize).append("\t");
		str.append("acceptFileType=").append(acceptFileType).append("\t");
		str.append("bizCode=").append(bizCode).append("\t");
		str.append("url=").append(url).append("\t");
		str.append("valueField=").append(valueField).append("\t");
		str.append("textField=").append(textField).append("\t");
		str.append("windowWidth=").append(windowWidth).append("\t");
		str.append("windowHeight=").append(windowHeight).append("\t");
		str.append("maximizable=").append(maximizable).append("\t");
		str.append("maximize=").append(maximize).append("\t");
		str.append("dataProvider=").append(dataProvider).append("\t");
		return str.toString();
	}

	@Override
	public String toHtmlString() {
		return "<a href=\"javascript:void(0);\" onclick=\"viewMore('FieldTemplate','" + getCode() + "');\">" + getName() + "(" + hashCode() + ")" + "</a>";
	}

	/**
	 * @return the type
	 */
	public FieldTemplateType getType() {
		return type;
	}

	/**
	 * @param type
	 *            the type to set
	 */
	public void setType(FieldTemplateType type) {
		this.type = type;
	}

	/**
	 * @return the sql
	 */
	public String getSql() {
		return sql;
	}

	/**
	 * @param sql
	 *            the sql to set
	 */
	public void setSql(String sql) {
		this.sql = sql;
	}

	/**
	 * @return the dicRoot
	 */
	public int getDicRoot() {
		return dicRoot;
	}

	/**
	 * @param dicRoot
	 *            the dicRoot to set
	 */
	public void setDicRoot(int dicRoot) {
		this.dicRoot = dicRoot;
	}

	/**
	 * @return the multiple
	 */
	public int getMultiple() {
		return multiple;
	}

	/**
	 * @param multiple
	 *            the multiple to set
	 */
	public void setMultiple(int multiple) {
		this.multiple = multiple;
	}

	/**
	 * @return the cache
	 */
	public int getCache() {
		return cache;
	}

	/**
	 * @param cache
	 *            the cache to set
	 */
	public void setCache(int cache) {
		this.cache = cache;
	}

	/**
	 * @return the format
	 */
	public String getFormat() {
		return format;
	}

	/**
	 * @param format
	 *            the format to set
	 */
	public void setFormat(String format) {
		this.format = format;
	}

	/**
	 * @return the fileSize
	 */
	public int getFileSize() {
		return fileSize;
	}

	/**
	 * @param fileSize
	 *            the fileSize to set
	 */
	public void setFileSize(int fileSize) {
		this.fileSize = fileSize;
	}

	/**
	 * @return the url
	 */
	public String getUrl() {
		return url;
	}

	/**
	 * @param url
	 *            the url to set
	 */
	public void setUrl(String url) {
		this.url = url;
	}

	/**
	 * @return the onlyLeafSelect
	 */
	public int getOnlyLeafSelect() {
		return onlyLeafSelect;
	}

	/**
	 * @param onlyLeafSelect
	 *            the onlyLeafSelect to set
	 */
	public void setOnlyLeafSelect(int onlyLeafSelect) {
		this.onlyLeafSelect = onlyLeafSelect;
	}

	/**
	 * @return the options
	 */
	public String getOptions() {
		return options;
	}

	/**
	 * @param options
	 *            the options to set
	 */
	public void setOptions(String options) {
		this.options = options;
	}

	/**
	 * @return the optionsList
	 */
	public List<Map<String, Object>> getOptionsList() {
		return optionsList;
	}

	/**
	 * @param optionsList
	 *            the optionsList to set
	 */
	public void setOptionsList(List<Map<String, Object>> optionsList) {
		this.optionsList = optionsList;
	}

	/**
	 * @return the proto
	 */
	public int getProto() {
		return proto;
	}

	/**
	 * @param proto
	 *            the proto to set
	 */
	public void setProto(int proto) {
		this.proto = proto;
	}

	/**
	 * @return the bizCode
	 */
	public String getBizCode() {
		return bizCode;
	}

	/**
	 * @param bizCode
	 *            the bizCode to set
	 */
	public void setBizCode(String bizCode) {
		this.bizCode = bizCode;
	}

	/**
	 * @return the valueField
	 */
	public String getValueField() {
		return valueField;
	}

	/**
	 * @param valueField
	 *            the valueField to set
	 */
	public void setValueField(String valueField) {
		this.valueField = valueField;
	}

	/**
	 * @return the textField
	 */
	public String getTextField() {
		return textField;
	}

	/**
	 * @param textField
	 *            the textField to set
	 */
	public void setTextField(String textField) {
		this.textField = textField;
	}

	/**
	 * @return the windowWidth
	 */
	public int getWindowWidth() {
		return windowWidth;
	}

	/**
	 * @param windowWidth
	 *            the windowWidth to set
	 */
	public void setWindowWidth(int windowWidth) {
		this.windowWidth = windowWidth;
	}

	/**
	 * @return the windowHeight
	 */
	public int getWindowHeight() {
		return windowHeight;
	}

	/**
	 * @param windowHeight
	 *            the windowHeight to set
	 */
	public void setWindowHeight(int windowHeight) {
		this.windowHeight = windowHeight;
	}

	/**
	 * @return the maximizable
	 */
	public int getMaximizable() {
		return maximizable;
	}

	/**
	 * @param maximizable
	 *            the maximizable to set
	 */
	public void setMaximizable(int maximizable) {
		this.maximizable = maximizable;
	}

	/**
	 * @return the maximize
	 */
	public int getMaximize() {
		return maximize;
	}

	/**
	 * @param maximize
	 *            the maximize to set
	 */
	public void setMaximize(int maximize) {
		this.maximize = maximize;
	}

	/**
	 * @return the autofill
	 */
	public int getAutofill() {
		return autofill;
	}

	/**
	 * @param autofill
	 *            the autofill to set
	 */
	public void setAutofill(int autofill) {
		this.autofill = autofill;
	}

	/**
	 * @return the acceptFileType
	 */
	public String getAcceptFileType() {
		return acceptFileType;
	}

	/**
	 * @param acceptFileType
	 *            the acceptFileType to set
	 */
	public void setAcceptFileType(String acceptFileType) {
		this.acceptFileType = acceptFileType;
	}

	/**
	 * @return the dataProvider
	 */
	public IFieldTemplateDataProvider getDataProvider() {
		return dataProvider;
	}

	/**
	 * @param dataProvider
	 *            the dataProvider to set
	 */
	public void setDataProvider(IFieldTemplateDataProvider dataProvider) {
		this.dataProvider = dataProvider;
	}

	@Override
	public FieldTemplate clone() throws CloneNotSupportedException {
		return (FieldTemplate) super.clone();
	}
}
